const db = wx.cloud.database(); // 初始化云数据库实例
const _ = db.command; // 获取数据库命令操作符
const dbHelper = require('../../../utils/dbHelper.js'); // 引入数据库助手工具，用于获取用户信息
const util = require('../../../utils/util.js'); // 引入工具函数，用于日期处理等功能

Page({
  data: {
    studentId: null, // 旧参数方式的学生ID
    userId: null, // 新增：用于存储从URL参数获取的userId
    studentInfo: null, // 学生信息对象
    testRecords: [], // 学生的测试记录列表
    isLoading: true, // 页面加载状态
    errorMsg: '', // 错误信息
    // 风险等级定义（与心理状况监控页面保持一致）
    warningLevels: {
      normal: { text: '正常', color: '#67C23A' },
      mild: { text: '轻度异常', color: '#E6A23C' },
      moderate: { text: '中度异常', color: '#F56C6C' },
      severe: { text: '重度异常', color: '#E71919' }, 
    }
  },

  onLoad(options) {
    console.log("学生详情页接收到参数:", options);
    // 处理不同来源的参数
    if (options.id) {
      // 旧的参数处理方式
      this.setData({ studentId: options.id });
      this.loadStudentInfo(options.id);
    } else if (options.userId) {
      // 新的参数处理方式，直接接收userId
      this.setData({ userId: options.userId });
      this.loadStudentData();
    } else {
      // 处理参数缺失的情况
      console.error("学生详情页面未接收到学生ID");
      this.setData({ isLoading: false, errorMsg: '未找到学生信息，缺少ID' });
      wx.showToast({ title: '参数错误', icon: 'none' });
    }
  },

  // 加载学生详细信息和测试记录
  async loadStudentData() {
    this.setData({ isLoading: true, errorMsg: '' }); // 开始加载，清空错误信息
    try {
      // 1. 获取学生基本信息
      const userRes = await db.collection('users').doc(this.data.userId).get();
      if (!userRes.data) {
        throw new Error("未找到学生信息");
      }
      
      const studentInfo = userRes.data;
      this.setData({ studentInfo });
      
      // 2. 获取该学生的所有测试记录，按时间降序排列
      // 使用多种匹配条件: userId, openid, 或 username
      console.log(`获取学生(userId=${studentInfo._id}, username=${studentInfo.username}, openid=${studentInfo.openid || studentInfo._openid})的测试记录`);
      
      // 使用or操作符组合多个查询条件
      const testsRes = await db.collection('psychological_tests')
        .where(_.or([
          { userId: studentInfo._id },
          { username: studentInfo.username },
          { openid: studentInfo.openid || studentInfo._openid }
        ]))
        .orderBy('createTime', 'desc')
        .get();
      
      // 处理测试记录，格式化日期和计算分数
      const formattedRecords = testsRes.data.map(record => {
        // 尝试格式化日期，如果失败则使用原始日期
        let formattedDate = record.createTime;
        try {
          if (typeof record.createTime === 'string') {
            // 如果是ISO日期字符串，转为Date对象
            formattedDate = new Date(record.createTime).toLocaleString('zh-CN');
          } else if (record.createTime instanceof Date) {
            formattedDate = record.createTime.toLocaleString('zh-CN');
          }
        } catch (err) {
          console.warn("日期格式化失败:", err);
        }
        
        // 计算原始分数和满分总分（如果需要）
        let originalScore = record.originalScore;
        let maxPossibleScore = record.maxPossibleScore;
        
        // 如果有detailedAnswers但没有原始分数，计算它们
        if (record.detailedAnswers && record.detailedAnswers.length > 0 && 
            (originalScore === undefined || maxPossibleScore === undefined)) {
          console.log('重新计算测试记录ID:', record._id, '的原始分数');
          originalScore = 0;
          // 累加各题目得分计算总分
          record.detailedAnswers.forEach(answer => {
            originalScore += answer.score;
          });
          maxPossibleScore = record.detailedAnswers.length * 4; // 每题满分4分
          console.log('计算结果:', originalScore, '/', maxPossibleScore);
        }
        
        // 处理可能的字段名不匹配，确保数据一致性
        return {
          ...record,
          formattedDate,
          // 确保字段名一致，兼容数据库中的实际字段
          testType: record.type || record.testType, // 数据库中可能是 'type'
          rawScore: originalScore || record.totalScore, // 原始分可能使用不同字段名
          originalScore: originalScore, // 添加计算后的原始分
          maxPossibleScore: maxPossibleScore // 添加计算后的满分
        };
      });
      
      console.log(`获取到 ${formattedRecords.length} 条测试记录`);
      this.setData({ 
        testRecords: formattedRecords,
        isLoading: false
      });
      
    } catch (err) {
      // 处理错误情况
      console.error("加载学生数据失败", err);
      this.setData({
        isLoading: false,
        errorMsg: `加载失败: ${err.message || '请稍后重试'}`
      });
      wx.showToast({ title: '加载学生信息失败', icon: 'none' });
    }
  },

  // 加载学生详细信息 (旧方法，使用studentId)
  async loadStudentInfo(studentId) {
    this.setData({ isLoading: true, errorMsg: '' });
    try {
      // 注意：我们用 _id 查询，而不是 openid 或 studentId 字段
      // 尝试使用dbHelper获取学生信息，如果不存在则直接查询数据库
      let studentData = null;
      if (dbHelper.getUserById) { // 检查是否存在按ID查询的helper方法
        studentData = await dbHelper.getUserById(studentId);
      } else {
          console.warn("dbHelper.getUserById 不存在，将直接使用数据库查询");
          const res = await db.collection('users').doc(studentId).get();
          studentData = res.data;
      }

      // 检查是否获取到学生数据
      if (studentData) {
        console.log("获取到学生详细信息:", studentData);
        this.setData({
          studentInfo: studentData,
          isLoading: false
        });
        // 加载测试记录，使用多种条件匹配
        this.loadTestRecords(studentData);
      } else {
        throw new Error('数据库中未找到该学生');
      }
    } catch (err) {
      // 处理错误情况
      console.error("加载学生信息失败", err);
      this.setData({
        isLoading: false,
        errorMsg: `加载失败: ${err.message || '请稍后重试'}`
      });
      wx.showToast({ title: '加载学生信息失败', icon: 'none' });
    }
  },

  // 加载测试记录 (配合旧方法使用)
  async loadTestRecords(studentData) {
    try {
      console.log(`加载学生(userId=${studentData._id}, username=${studentData.username}, openid=${studentData.openid || studentData._openid})的测试记录`);
      
      // 使用多条件查询，提高匹配率
      const testsRes = await db.collection('psychological_tests')
        .where(_.or([
          { userId: studentData._id },
          { username: studentData.username },
          { openid: studentData.openid || studentData._openid }
        ]))
        .orderBy('createTime', 'desc')
        .get();
      
      // 处理测试记录，格式化日期和计算分数
      const formattedRecords = testsRes.data.map(record => {
        let formattedDate = record.createTime;
        try {
          if (typeof record.createTime === 'string') {
            formattedDate = new Date(record.createTime).toLocaleString('zh-CN');
          } else if (record.createTime instanceof Date) {
            formattedDate = record.createTime.toLocaleString('zh-CN');
          }
        } catch (err) {
          console.warn("日期格式化失败:", err);
        }
        
        // 计算原始分数和满分（如果需要）
        let originalScore = record.originalScore;
        let maxPossibleScore = record.maxPossibleScore;
        
        // 如果有detailedAnswers但没有原始分数，计算它们
        if (record.detailedAnswers && record.detailedAnswers.length > 0 && 
            (originalScore === undefined || maxPossibleScore === undefined)) {
          originalScore = 0;
          record.detailedAnswers.forEach(answer => {
            originalScore += answer.score;
          });
          maxPossibleScore = record.detailedAnswers.length * 4; // 每题满分4分
        }
        
        // 返回处理后的测试记录
        return {
          ...record,
          formattedDate: formattedDate,
          rawScore: originalScore || record.totalScore, // 确保兼容不同的字段名
          originalScore: originalScore,
          maxPossibleScore: maxPossibleScore
        };
      });
      
      console.log(`获取到 ${formattedRecords.length} 条测试记录`);
      this.setData({ testRecords: formattedRecords });
    } catch (err) {
      console.error("加载测试记录失败", err);
      wx.showToast({ title: '加载测试记录失败', icon: 'none' });
    }
  },

  // 刷新数据
  refreshData() {
      // 根据不同的ID类型调用相应的加载方法
      if (this.data.userId) {
          this.loadStudentData();
      } else if (this.data.studentId) {
          this.loadStudentInfo(this.data.studentId);
      }
  },

  // 预览头像
  previewAvatar() {
      if (this.data.studentInfo && this.data.studentInfo.avatarUrl) {
          // 使用微信预览图片API
          wx.previewImage({
              current: this.data.studentInfo.avatarUrl, // 当前显示图片的链接
              urls: [this.data.studentInfo.avatarUrl] // 需要预览的图片链接列表
          });
      }
  },

  // 拨打电话
  callPhone() {
      if (this.data.studentInfo && this.data.studentInfo.phone) {
          // 使用微信拨打电话API
          wx.makePhoneCall({
              phoneNumber: this.data.studentInfo.phone
          });
      } else {
          wx.showToast({ title: '未提供电话号码', icon: 'none' });
      }
  }
});